package demo1.java.controller;

import demo1.java.baseDemo.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2023-04-17
 * Time: 16:11
 */
@Controller
public class TeacherController {

    // 1. 属性注入
    /*
    * 优点: 简单
    * 缺点: 1. 无法实现 final 修饰的变量注入
    *      2. 兼容性差, 只能使用于 IoC容器, 即Spring容器
    *      3. 方法简单, 所以违背单一设计原则的概率更高
    */
//    @Autowired
//    private StudentService studentService;


    // 2. Setter 注入
    /*
       优点: 更符合单一设计原则, 每次都只能传递一个对象
       缺点: 1. 无法实现一个 final 修饰的注入对象
            2. 使用 Setter 注入的对象可能被修改
               由于是一个普通方法, 可能会被修改
    * */
//    private StudentService studentService;
//    @Autowired
//    public void setStudentService(StudentService studentService) {
//        this.studentService = studentService;
//    }

    // 3. 构造方法注入
    /**
     *
     * 优点: 1.可以注入一个 final修饰的变量
     *      2. 注入的对象不会被改变(构造方法只能执行一次)
     *      3. 构造方法注入可以保证注入对象完全被初始化
     *      4. 构造方法的兼容性更好
     */
    // final 变量在申明时必须赋值或构造时赋值
//    private final StudentService studentService;
//    //@Autowired  如果当前类只有一个构造方法前提下,可以不用Autowired 注释
//    public TeacherController(StudentService studentService) {
//        // 在构造的时候进行赋值
//        this.studentService = studentService;
//    }


    @Resource // 在属性注入和Setter注入中可以使用, 但是构造注入中无法使用
    private StudentService studentService;

    public void say() {
        System.out.println("say TeacherController");

        studentService.say();
    }

    // @Resource 来自 JDK  AutoWired来自 Spring
    // 在注入上, @Resource 只支持属性和Setter注入不支持构造方法注入, 但是AutoWried三种都支持
    // @Resource 支持更多参数设置, 而Autowired 很少只有一个, 当有多个同类型类需要注入, 此时Autowired就不行

}
